package com.qf.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置类
 *
 * @author lixu
 * 主题模式     主题交换机   RoutingKey
 * <p>
 * 绑定的时候：   将Q1绑定到交换机上的时候  使用调用方法 还是使用从SpringIOC容器获取呢？
 * <p>
 * 答案： 从SpringIOC容器获取 ：  是正确
 * <p>
 * 调用方法 ： 已经是2遍了 所以浪费性能 浪费内存  错误的
 */
@Configuration //加载到SpringIOC容器中
public class RabbitMQConfig {

    /**
     * 常量
     */
    //交换机名称
    public static final String TOPICEXCHANGE = "boot_topic_exchange";//名称随便起 只要不重名就行
    //队列1 名称
    public static final String TOPICQ1 = "boot_topic_q1";
    //队列2
    public static final String TOPICQ2 = "boot_topic_q2";


    /**
     * 创建队列1
     */
    @Bean //实例化到SpringIOC容器中
    public Queue topicQ1Queue() {
        //队列名
        //return new Queue(topicQ1);
        return QueueBuilder.durable(TOPICQ1).build();
    }

    /**
     * 创建队列2
     */
    @Bean
    public Queue topicQ2Queue() {
        //队列名
        //return new Queue(topicQ1);
        return QueueBuilder.durable(TOPICQ2).build();
    }

    /**
     * 创建交换机    主题
     */
    @Bean //实例化到SpringIOC容器中
    public Exchange topicExchange() {
        return ExchangeBuilder.topicExchange(TOPICEXCHANGE).build();
    }


    /**
     * 全局  ：  所有当前类的方法都可以使用
     */
 /*   @Autowired
    @Qualifier("topicQ1Queue")
    private Queue topicQ1Queue;//队列1
    @Autowired
    @Qualifier("topicQ2Queue")
    private Queue topicQ2Queue;//队列2   */


    /**
     * 绑定  交换机与 队列1 之间进行绑定   RoutingKey  *.orange.*
     */
    @Bean
    public Binding topicExchangeBindingToTopicQ1(
               @Qualifier("topicQ1Queue") Queue topicQ1Queue,
               @Qualifier("topicExchange") Exchange topicExchange
               ) {
        //参数1： 队列1
        // 第一种办法： 通过方法调用  获取到了队列1 topicQ1Queue()   下下策
        // 第二种办法： 从SpringIOC容器获取  上上策
        return BindingBuilder
                .bind(topicQ1Queue)
                .to(topicExchange)
                .with("*.orange.*")
                .noargs();//构建

    }

    /**
     * 绑定  交换机与 队列2 之间进行绑定   RoutingKey  *.*.rabbit
     */
    @Bean                                      //从SpringIOC容器获取出对应的队列
    public Binding topicExchangeBindingToTopicQ21(@Qualifier("topicQ2Queue") Queue topicQ2Queue,
                                                  @Qualifier("topicExchange") Exchange topicExchange) {
        //参数1： 队列1
        // 第一种办法： 通过方法调用  获取到了队列1 topicQ1Queue()
        return BindingBuilder
                .bind(topicQ2Queue)
                .to(topicExchange)
                .with("*.*.rabbit")
                .noargs();//构建

    }

    /**
     * 绑定  交换机与 队列2 之间进行绑定   RoutingKey lazy.#
     */
    @Bean
    public Binding topicExchangeBindingToTopicQ22(@Qualifier("topicQ2Queue") Queue topicQ2Queue,
                                                  @Qualifier("topicExchange") Exchange topicExchange) {
        //参数1： 队列1
        // 第一种办法： 通过方法调用  获取到了队列1 topicQ1Queue()
        return BindingBuilder
                .bind(topicQ2Queue)
                .to(topicExchange)
                .with("lazy.#")
                .noargs();//构建

    }


}
